from django.db import models
from company.models import Vehicle


class AlarmLocation(models.Model):
    """车辆报警位置
    """
    # alarm_flag = models.IntegerField()
    # status_flag = models.IntegerField()
    latitude = models.DecimalField(max_digits=18, decimal_places=15, null=True, blank=True, verbose_name='纬度')
    longitude = models.DecimalField(max_digits=18, decimal_places=15, null=True, blank=True, verbose_name='经度')
    altitude = models.DecimalField(max_digits=7, decimal_places=3, null=True, blank=True, verbose_name='海拔高度')
    speed = models.DecimalField(max_digits=11, decimal_places=6, null=True, blank=True, verbose_name='速度')
    direction = models.CharField(max_length=50, blank=True, null=True, verbose_name='方向')
    gps_time = models.DateTimeField(max_length=50, blank=True, null=True, verbose_name='时间')
    location_attach_data = models.CharField(max_length=20, blank=True, null=True)
    custom_location_attach_original_data = models.CharField(max_length=50, blank=True, null=True)
    custom_location_attach_data = models.CharField(max_length=50, blank=True, null=True)
    created_time = models.DateTimeField(auto_now_add=True, editable=False)
    modified_on = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'alarm_location'
        verbose_name = '车辆报警位置'
        verbose_name_plural = verbose_name


class Alarm(models.Model):
    """报警

    报警标志位定义
    0x00_00_00_00-0xFF_FF_FF_FF

    位      标志
    --      ----
    0       1：紧急报警，触动报警开关后触发 收到应答后清零
    1       1：超速报警 标志维持至报警条件解除
    2       1：疲劳驾驶 标志维持至报警条件解除
    3       1：危险预警 收到应答后清零
    4       1：GNSS 模块发生故障 标志维持至报警条件解除
    5       1：GNSS 天线未接或被剪断 标志维持至报警条件解除
    6       1：GNSS 天线短路 标志维持至报警条件解除
    7       1：终端主电源欠压 标志维持至报警条件解除
    8       1：终端主电源掉电 标志维持至报警条件解除
    9       1：终端LCD 或显示器故障 标志维持至报警条件解除
    10      1：TTS 模块故障 标志维持至报警条件解除
    11      1：摄像头故障 标志维持至报警条件解除
    12      1：道路运输证IC 卡模块故障 标志维持至报警条件解除
    13      1：超速预警 标志维持至报警条件解除
    14      1：疲劳驾驶预警 标志维持至报警条件解除
    15      保留
    16      保留
    17      保留
    18      1：当天累计驾驶超时 标志维持至报警条件解除
    19      1：超时停车 标志维持至报警条件解除
    20      1：进出区域 收到应答后清零
    21      1：进出路线 收到应答后清零
    22      1：路段行驶时间不足/过长 收到应答后清零
    23      1：路线偏离报警 标志维持至报警条件解除
    24      1：车辆VSS 故障 标志维持至报警条件解除
    25      1：车辆油量异常 标志维持至报警条件解除
    26      1：车辆被盗(通过车辆防盗器) 标志维持至报警条件解除
    27      1：车辆非法点火 收到应答后清零
    28      1：车辆非法位移 收到应答后清零
    29      1：碰撞预警 标志维持至报警条件解除
    30      1：侧翻预警 标志维持至报警条件解除
    31      1：非法开门报警（终端未设置区域时，不判断非法开门）收到应答后清零
    """

    CategoryChoice = (
        (0, '紧急报警'),
        (1, '超速报警'),
        (2, '疲劳驾驶'),
        (3, '危险预警'),
        (4, 'GNSS模块发生故障'),
        (5, 'GNSS天线未接或被剪断'),
        (6, 'GNSS天线短路'),
        (7, '终端主电源欠压'),
        (8, '终端主电源掉电'),
        (9, '终端LCD或显示器故障'),
        (10, 'TTS模块故障'),
        (11, '摄像头故障'),
        (12, '道路运输证IC卡模块故障'),
        (13, '超速预警'),
        (14, '疲劳驾驶预警'),
        (15, '保留1'),
        (16, '保留2'),
        (17, '保留3'),
        (18, '当天累计驾驶超时'),
        (19, '超时停车'),
        (20, '进出区域'),
        (21, '进出路线'),
        (22, '路段行驶时间不足/过长'),
        (23, '路线偏离报警'),
        (24, '车辆VSS故障'),
        (25, '车辆油量异常'),
        (26, '车辆被盗'),
        (27, '车辆非法点火'),
        (28, '车辆非法位移'),
        (29, '碰撞预警'),
        (30, '侧翻预警'),
        (31, '非法开门报警'),

        # 开易报警类型
        (32, '驾驶员异常'),
        (33, '制动异常'),
        (34, '未知异常'),

        # 小卓报警类型
        (35, '抽烟'),
        (36, '打电话'),
        (37, '摄像头遮挡'),
        (38, '左顾右盼'),
        (39, '换人提醒'),
        (40, '驾驶超时'),
        (41, '车道偏移'),
        (42, '前车过近'),
        (43, '急刹车'),
        (44, '急减速'),
        (45, '急加速'),
        (46, '急转弯'),
        (47, '行人检测'),
    )

    MediaURICategoryChoice = (
        (1, '图片源'),
        (2, 'MP4视频源'),
    )
    location = models.OneToOneField(AlarmLocation, on_delete=models.CASCADE, verbose_name='location', null=True)
    vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE, db_index=True, verbose_name='关联车辆')
    category = models.PositiveSmallIntegerField(choices=CategoryChoice, db_index=True, verbose_name='报警类型')
    status = models.CharField(max_length=15, blank=True, null=True, verbose_name='状态，是否人工确认')
    start_time = models.DateTimeField(db_index=True, max_length=50, null=True, verbose_name='报警开始时间')
    end_time = models.DateTimeField(db_index=True, max_length=50, blank=True, null=True, verbose_name='报警结束时间')
    media_uri_category = models.PositiveSmallIntegerField(choices=MediaURICategoryChoice, verbose_name='详情数据类型')
    media_uri = models.CharField(max_length=500, blank=True, null=True, verbose_name='详情URI地址')
    created_time = models.DateTimeField(auto_now_add=True, editable=False)
    modified_on = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'alarm'
        ordering = ('-start_time', )
        verbose_name = '报警'
        verbose_name_plural = verbose_name
